package com.xuecheng.manage_media_process.mq;

import com.alibaba.fastjson.JSON;
import com.xuecheng.framework.domain.media.MediaFile;
import com.xuecheng.framework.domain.media.MediaFileProcess_m3u8;
import com.xuecheng.framework.utils.HlsVideoUtil;
import com.xuecheng.framework.utils.Mp4VideoUtil;
import com.xuecheng.manage_media_process.dao.MediaFileRepository;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;
import java.util.Optional;

@Component
public class MediaProcessTask {

    @Autowired
    private MediaFileRepository mediaFileRepository;
    //FFmpeg文件路径
    @Value("${xc-service-manage-media.ffmpeg-path}")
    private String ffmpegPath;
    //上传文件的根目录
    @Value("${xc-service-manage-media.video-location}")
    private String serverPath;

    // 接收到视频处理消息,  开始处理消息
    @RabbitListener(queues = "${xc-service-manage-media.mq.queue-media-video-processor}", containerFactory = "customContainerFactory" )
    public void receiveMediaProcessTask(String msg) {
        //1. 解析消息内容, 得到mediaId
        Map map = JSON.parseObject(msg, Map.class);
        String mediaId = (String) map.get("mediaId");
        //2. 根据mediaId从mongoDB中查询文件信息
        Optional<MediaFile> mediaFileOptional = mediaFileRepository.findById(mediaId);
        if (!mediaFileOptional.isPresent()) {
            return;
        }
        MediaFile mediaFile = mediaFileOptional.get();
        // 判断文件格式
        if (!"avi".equals(mediaFile.getFileType())) {
            // 文件格式不是avi, 设置文件处理状态为   无需处理
            mediaFile.setProcessStatus("303004");
            mediaFileRepository.save(mediaFile);
            return;
        } else {
            //设置文件处理状态为    处理中
            mediaFile.setProcessStatus("303001");
            mediaFileRepository.save(mediaFile);
        }
        //3. 使用工具类将avi文件转成mp4
            // 要处理的视频文件的路径
        String videoPath = serverPath + mediaFile.getFilePath() + mediaFile.getFileName();
            // 转成的mp4后,文件的名字
        String mp4Name = mediaId + ".mp4";
            // 生成的mp4后, 文件的存放文件夹路径
        String mp4FolderPath = serverPath + mediaFile.getFilePath();
            // 创建工具类处理视频文件
        Mp4VideoUtil mp4VideoUtil = new Mp4VideoUtil(ffmpegPath, videoPath, mp4Name, mp4FolderPath);
        String flag = mp4VideoUtil.generateMp4();
        if (!"success".equals(flag)) {
            // 视频转换失败, 设置视频处理状态为  失败
            mediaFile.setProcessStatus("303003");
            //定义MediaFileProcess_m3u8, 记录失败原因
            MediaFileProcess_m3u8 mediaFileProcess_m3u8 = new MediaFileProcess_m3u8();
            mediaFileProcess_m3u8.setErrormsg(flag);
            mediaFile.setMediaFileProcess_m3u8(mediaFileProcess_m3u8);
            //保存mongoDB
            mediaFileRepository.save(mediaFile);
            return;
        }
        // 4. 将mp4生成m3u8和ts文件
        String mp4_video_path = mp4FolderPath + mp4Name;
            // 生成的m3u8文件名称
        String m3u8_name = mediaId + ".m3u8";
            //  m3u8文件所在目录的路径
        String m3u8FolderPath = mp4FolderPath + "hls/";
        HlsVideoUtil hlsVideoUtil = new HlsVideoUtil(ffmpegPath, mp4_video_path, m3u8_name, m3u8FolderPath);
        String generateM3u8 = hlsVideoUtil.generateM3u8();
        if (!"success".equals(generateM3u8)) {
            // 视频转换失败, 设置视频处理状态为  失败
            mediaFile.setProcessStatus("303003");
            //定义MediaFileProcess_m3u8, 记录失败原因
            MediaFileProcess_m3u8 mediaFileProcess_m3u8 = new MediaFileProcess_m3u8();
            mediaFileProcess_m3u8.setErrormsg(flag);
            mediaFile.setMediaFileProcess_m3u8(mediaFileProcess_m3u8);
            //保存mongoDB
            mediaFileRepository.save(mediaFile);
            return;
        }
            // 处理成功
            // 设置处理结果为成功
        mediaFile.setProcessStatus("303002");
            // 将生成的ts文件记录到数据库,  后期如果需要这些文件, 可以直接从数据库获取
        MediaFileProcess_m3u8 mediaFileProcess_m3u8 = new MediaFileProcess_m3u8();
            // 获取生成ts文件
        List<String> ts_list = hlsVideoUtil.get_ts_list();
        mediaFileProcess_m3u8.setTslist(ts_list);
        mediaFile.setMediaFileProcess_m3u8(mediaFileProcess_m3u8);
            //保存 FileUrl, 用于前端播放视频请求资源
        String fileUrl = mediaFile.getFilePath() + "hls/" + m3u8_name;
        mediaFile.setFileUrl(fileUrl);
        // 保存数据库
        mediaFileRepository.save(mediaFile);
    }
}
